home *** CD-ROM | disk | FTP | other *** search
/ Aminet 6 / Aminet 6 - June 1995.iso / Aminet / dev / e / capus2.lha / capus2 / 3DView / Sources / 3DViewerLoadObject.e < prev    next >
Encoding:
Text File  |  1995-04-03  |  36.5 KB  |  702 lines

  1. /*"ReadObject3D :Routines de chargement des objets 3D."*/
  2. /*"p_ReadFile(fichier) :Lit un fichier 3D <fichier> STRING et renvois sur la bonne routine."*/
  3. PROC p_ReadFile(fichier) HANDLE 
  4. /********************************************************************************
  5.  * Para         : NONE
  6.  * Return       : OK_FICHIER if ok,else the error.
  7.  * Description  : Read source file and call the good Proc.
  8.  *******************************************************************************/
  9.     DEF len,adr,buf,handle,flen=TRUE,chunk,retour_read=NIL
  10.     DEF w_l
  11.     IF (flen:=FileLength(fichier))=-1 THEN Raise(ER_NOFICHIER)
  12.     IF (buf:=New(flen+1))=NIL THEN Raise(ER_MEM)
  13.     IF (handle:=Open(fichier,1005))=NIL THEN Raise(ER_OPEN)
  14.     len:=Read(handle,buf,flen)
  15.     Close(handle)
  16.     IF len<1 THEN Raise(ER_NOFICHIER)
  17.     adr:=buf
  18.     chunk:=Int(adr)
  19.     IF chunk=ID_3D2
  20.         Dispose(buf)
  21.         w_l:=p_InitReq(get_3DView_string(WREQ_3D2))
  22.         retour_read:=p_Read3D2File(fichier)
  23.         CloseW(w_l)
  24.         Raise(retour_read)
  25.     ELSEIF chunk=ID_3D3D
  26.         Dispose(buf)
  27.         w_l:=p_InitReq(get_3DView_string(WREQ_3D))
  28.         retour_read:=p_Read3DFile(fichier)
  29.         CloseW(w_l)
  30.         Raise(retour_read)
  31.     ENDIF
  32.     chunk:=Long(adr)
  33.     IF (chunk=ID_VR3D) OR (chunk=ID_VE3D)
  34.         Dispose(buf)
  35.         w_l:=p_InitReq(get_3DView_string(WREQ_VERTEX))
  36.         retour_read:=p_ReadVertexFile(chunk,fichier)
  37.         CloseW(w_l)
  38.         Raise(retour_read)
  39.     ELSEIF chunk=ID_3DPRO
  40.         Dispose(buf)
  41.         w_l:=p_InitReq(get_3DView_string(WREQ_3DPRO))
  42.         retour_read:=p_Read3DProFile(fichier)
  43.         CloseW(w_l)
  44.         Raise(retour_read)
  45.     ENDIF
  46.     chunk:=Long(adr+8)
  47.     SELECT chunk
  48.         CASE ID_TDDD
  49.             Dispose(buf)
  50.             w_l:=p_InitReq(get_3DView_string(WREQ_IMAGINE))
  51.             retour_read:=p_ReadImagineFile(fichier)
  52.             CloseW(w_l)
  53.             Raise(retour_read)
  54.         CASE ID_SC3D
  55.             Dispose(buf)
  56.             w_l:=p_InitReq(get_3DView_string(WREQ_SCULPT))
  57.             retour_read:=p_ReadSculptFile(fichier)
  58.             CloseW(w_l)
  59.             Raise(retour_read)
  60.         CASE ID_3DDD
  61.             Dispose(buf)
  62.             w_l:=p_InitReq(get_3DView_string(WREQ_VERTEX2))
  63.             retour_read:=p_ReadVertex2File(fichier)
  64.             CloseW(w_l)
  65.             Raise(retour_read)
  66.         /*
  67.         CASE ID_LWOB
  68.             Dispose(buf)
  69.             IF view_window THEN w_req:=init_req('Load LightWave Object(s) ') ELSE w_req:=init_reqwb('Load LightWave Object(s) ')
  70.             retour_read:=readlightwavefile()
  71.             CloseW(w_req)
  72.             RETURN retour_read
  73.         */
  74.         DEFAULT
  75.             Dispose(buf)
  76.             RtEZRequestA(get_3DView_string(REQ_INCONNU),
  77.                          get_3DView_string(GAD_OUI),0,0,[RTEZ_REQTITLE,fichier,RT_WINDOW,view_window,RT_LOCKWINDOW,TRUE,0])
  78.             Raise(ER_INCONNU)
  79.     ENDSELECT
  80.     Raise(OK_FICHIER)
  81. EXCEPT
  82.     RETURN exception
  83. ENDPROC
  84. /**/
  85. /*"p_Read3DFile(source) :Lit un fichier au format Cyber v1.0. <source>=Fichier a charger."*/
  86. PROC p_Read3DFile(source) HANDLE
  87. /********************************************************************************
  88.  * Para         : NONE
  89.  * Return       : OK_FICHIER if ok,else the error.
  90.  * Description  : Read a CyberStudio v1.0 (Atari) file.
  91.  *******************************************************************************/
  92.   DEF len,a,adr,buf,handle,flen=TRUE,i
  93.   DEF nbrs_obj,obj_name[80]:STRING,x,y,z
  94.   DEF myobj:PTR TO object3d,piv_pts
  95.   /*****************************************************/
  96.   flen:=FileLength(source)
  97.   buf:=New(flen+1)
  98.   handle:=Open(source,1005)
  99.   len:=Read(handle,buf,flen)
  100.   Close(handle)
  101.   adr:=buf
  102.   nbrs_obj:=Int(adr+2)
  103.   mybase.nbrsobjs:=mybase.nbrsobjs+nbrs_obj
  104.   adr:=buf+34
  105.   FOR i:=0 TO nbrs_obj-1
  106.       StringF(obj_name,'\s',adr)                                 /*==== name of object         ====*/
  107.       myobj:=New(SIZEOF object3d)                                /*==== Allocate new structure ====*/
  108.       myobj.typeobj:=TYPE_OLDCYBER                               /*==== Type object            ====*/
  109.       myobj.selected:=FALSE                                      /*==== Object selected        ====*/
  110.       myobj.bounded:=FALSE                                       /*==== Object bounded         ====*/
  111.       myobj.nbrspts:=Int(adr+9)                                  /*==== Number of vertices     ====*/
  112.       mybase.totalpts:=mybase.totalpts+myobj.nbrspts             /*==== Update database (pts)  ====*/
  113.       adr:=adr+11                                                /*==== Jump to datapts        ====*/
  114.       myobj.datapts:=New(myobj.nbrspts*12)                       /*==== Allocate Mem for pts   ====*/
  115.       piv_pts:=myobj.datapts                                     /*==== Pointer to ObjDataPts  ====*/
  116.       FOR a:=0 TO myobj.nbrspts-1
  117.           x:=Long(adr)                                           /*==== Read x ====*/
  118.           y:=Long(adr+(myobj.nbrspts*4))                         /*==== Read y ====*/
  119.           z:=Long(adr+(myobj.nbrspts*8))                         /*==== Read z ====*/
  120.           ^piv_pts:=Mul(SpFix(x),100)                            /*==== Stock x ====*/
  121.           piv_pts:=piv_pts+4
  122.           ^piv_pts:=Mul(SpFix(y),100)                            /*==== Stock y ====*/
  123.           piv_pts:=piv_pts+4
  124.           ^piv_pts:=Mul(SpFix(z),100)                            /*==== Stock z ====*/
  125.           /*===========================
  126.           ^piv_pts:=x                            /*==== Stock x ====*/
  127.           piv_pts:=piv_pts+4
  128.           ^piv_pts:=y                            /*==== Stock y ====*/
  129.           piv_pts:=piv_pts+4
  130.           ^piv_pts:=z                            /*==== Stock z ====*/
  131.           ==============================*/
  132.           piv_pts:=piv_pts+4
  133.           adr:=adr+4
  134.       ENDFOR
  135.       adr:=adr+(myobj.nbrspts*8)                                 /*==== Jump to faces          ====*/
  136.       myobj.nbrsfcs:=Int(adr)                                    /*==== Number of faces        ====*/
  137.       mybase.totalfcs:=mybase.totalfcs+myobj.nbrsfcs             /*==== Update DataBase (fcs)  ====*/
  138.       myobj.datafcs:=New(myobj.nbrsfcs*12)                       /*==== Allocate Mem for faces ====*/
  139.       piv_pts:=myobj.datafcs                                     /*==== Pointer to datafaces   ====*/
  140.       adr:=adr+2                                                 /*==== Jump to datafcs        ====*/
  141.       FOR a:=0 TO myobj.nbrsfcs-1
  142.           x:=Int(adr)                                            /*==== Number 1 (vertive) ====*/
  143.           y:=Int(adr+2)                                          /*==== Number 2 (vertive) ====*/
  144.           z:=Int(adr+4)                                          /*==== Number 3 (vertice) ====*/
  145.           ^piv_pts:=x                                            /*==== Stock vertice 1 ====*/
  146.           piv_pts:=piv_pts+4
  147.           ^piv_pts:=y                                            /*==== Stock vertice 2 ====*/
  148.           piv_pts:=piv_pts+4
  149.           ^piv_pts:=z                                            /*==== Stock vertice 3 ====*/
  150.           piv_pts:=piv_pts+4
  151.           adr:=adr+8
  152.       ENDFOR
  153.       p_AjouteNode(mybase.objlist,obj_name,myobj)
  154.   ENDFOR
  155.   IF buf THEN Dispose(buf)
  156.   Raise(OK_FICHIER)
  157. EXCEPT
  158.   RETURN exception
  159. ENDPROC
  160. /**/
  161. /*"p_Read3D2File(source) :Lit un fichier au format Cyber v2.0. <source>=Fichier a charger."*/
  162. PROC p_Read3D2File(source) HANDLE
  163. /********************************************************************************
  164.  * Para         : NONE
  165.  * Return       : OK_FICHIER if ok,else the error.
  166.  * Description  : Read a CyberStudio v2.0 (Atari) file.
  167.  *******************************************************************************/
  168.     DEF len,a,adr,buf,handle,flen=TRUE,i
  169.     DEF nbrs_obj,obj_name[80]:STRING,x,y,z
  170.     DEF myobj:PTR TO object3d,piv_pts,p1,p2,p3
  171.     /*****************************************************/
  172.     flen:=FileLength(source)
  173.     buf:=New(flen+1)
  174.     handle:=Open(source,1005)
  175.     len:=Read(handle,buf,flen)
  176.     Close(handle)
  177.     adr:=buf
  178.     nbrs_obj:=Int(adr+2)
  179.     mybase.nbrsobjs:=mybase.nbrsobjs+nbrs_obj
  180.     adr:=buf+256
  181.     FOR i:=0 TO nbrs_obj-1
  182.         StringF(obj_name,'\s',adr)
  183.         myobj:=New(SIZEOF object3d)                                /*==== Allocate new structure ====*/
  184.         myobj.typeobj:=TYPE_NEWCYBER                               /*==== Type object            ====*/
  185.         myobj.selected:=FALSE                                      /*==== Object selected        ====*/
  186.         myobj.bounded:=FALSE                                       /*==== Object bounded         ====*/
  187.         myobj.nbrspts:=Int(adr+9)                                  /*==== Number of vertices     ====*/
  188.         mybase.totalpts:=mybase.totalpts+myobj.nbrspts             /*==== Update database (pts)  ====*/
  189.         adr:=adr+11                                                /*==== Jump to datapts        ====*/
  190.         myobj.datapts:=New(myobj.nbrspts*12)                       /*==== Allocate Mem for pts   ====*/
  191.         piv_pts:=myobj.datapts                                     /*==== Pointer to ObjDataPts  ====*/
  192.         FOR a:=0 TO myobj.nbrspts-1
  193.             x:=Int(adr)                                            /*==== Read x ====*/
  194.             y:=Int(adr+2)                                          /*==== Read y ====*/
  195.             z:=Int(adr+4)                                          /*==== Read z ====*/
  196.             IF x>32767 THEN x:=x-65535
  197.             IF y>32767 THEN y:=y-65535
  198.             IF z>32767 THEN z:=z-65535
  199.             adr:=adr+6
  200.             ^piv_pts:=x                                            /*==== Stock x ====*/
  201.             piv_pts:=piv_pts+4
  202.             ^piv_pts:=y                                            /*==== Stock y ====*/
  203.             piv_pts:=piv_pts+4
  204.             ^piv_pts:=z                                            /*==== Stock z ====*/
  205.             piv_pts:=piv_pts+4
  206.         ENDFOR
  207.         myobj.nbrsfcs:=Int(adr)                                    /*==== Number of faces       ====*/
  208.         mybase.totalfcs:=mybase.totalfcs+myobj.nbrsfcs             /*==== Update database (fcs) ====*/
  209.         myobj.datafcs:=New(myobj.nbrsfcs*12)                       /*==== Allocate Mem for fcs  ====*/
  210.         piv_pts:=myobj.datafcs                                     /*==== Pointer to ObjDataFcs ====*/
  211.         adr:=adr+2                                                 /*==== Jump to datafcs       ====*/
  212.         FOR a:=0 TO myobj.nbrsfcs-1
  213.             p1:=Int(adr)                                           /*==== Read 1 vertice ====*/
  214.             p2:=Int(adr+2)                                         /*==== Read 2 vertice ====*/
  215.             p3:=Int(adr+4)                                         /*==== Read 3 vertice ====*/
  216.             ^piv_pts:=p1                                           /*==== Stock 1 vertice ====*/
  217.             piv_pts:=piv_pts+4
  218.             ^piv_pts:=p2                                           /*==== Stock 2 vertice ====*/
  219.             piv_pts:=piv_pts+4
  220.             ^piv_pts:=p3                                           /*==== Stock 3 vertice ====*/
  221.             piv_pts:=piv_pts+4
  222.             adr:=adr+8
  223.         ENDFOR
  224.         p_AjouteNode(mybase.objlist,obj_name,myobj)
  225.     ENDFOR
  226.     IF buf THEN Dispose(buf)
  227.     Raise(OK_FICHIER)
  228. EXCEPT
  229.     RETURN exception
  230. ENDPROC
  231. /**/
  232. /*"p_Read3DProFile(source) :Lit un fichier au format 3DPro v1.10. <source>=Fichier a charger."*/
  233. PROC p_Read3DProFile(source) HANDLE
  234. /********************************************************************************
  235.  * Para         : NONE
  236.  * Return       : OK_FICHIER if ok,else the error.
  237.  * Description  : Read a 3Dpro v1.10 (Amiga) file.
  238.  *******************************************************************************/
  239.   DEF len,adr,buf,handle,flen=TRUE
  240.   DEF count=NIL,piv_pts,pf
  241.   DEF x,y,z
  242.   DEF myobj:PTR TO object3d,adr_face=NIL,pts_size=NIL
  243.   DEF reel_nbrs_faces=0,max_pts_face=0,badr,obj_name[80]:STRING
  244.   DEF numobj,oldnumface
  245.   /*****************************************************/
  246.   flen:=FileLength(source)
  247.   buf:=New(flen+1)
  248.   handle:=Open(source,1005)
  249.   len:=Read(handle,buf,flen)
  250.   Close(handle)
  251.   adr:=buf
  252.   numobj:=p_CountNodes(mybase.objlist)
  253.   StringF(obj_name,'Object_\d',numobj+1)
  254.   myobj:=New(SIZEOF object3d)                       /*==== Allocate Mem for structure ====*/
  255.   myobj.typeobj:=TYPE_3DPRO                         /*==== Type object                ====*/
  256.   myobj.selected:=FALSE                             /*==== Object selected            ====*/
  257.   myobj.bounded:=FALSE                              /*==== Object bounded             ====*/
  258.   myobj.nbrspts:=(Int(adr+13)-Int(adr+11))          /*==== Number of pts              ====*/
  259.   myobj.nbrsfcs:=(Int(adr+9)-Int(adr+7))            /*==== Number of faces            ====*/ /*==== WARNING !!, with 3dpro faces can have more than 3 vertice ====*/
  260.   oldnumface:=myobj.nbrsfcs
  261.   mybase.totalpts:=mybase.totalpts+myobj.nbrspts    /*==== Update database (pts)      ====*/
  262.   myobj.datapts:=New(myobj.nbrspts*12)              /*==== Allocate mem for pts       ====*/
  263.   piv_pts:=myobj.datapts                            /*==== Pointer to objdatapts      ====*/
  264.   adr:=adr+76+7                                     /*==== Jump to datapts            ====*/
  265.   FOR count:=0 TO myobj.nbrspts-1
  266.       x:=SpFix(SpMul(SpFlt(Long(adr)),mybase.fct3dpro))                                  /*==== Read x ====*/
  267.       y:=SpFix(SpMul(SpFlt(Long(adr+4)),mybase.fct3dpro))                                /*==== Read y ====*/
  268.       z:=SpFix(SpMul(SpFlt(Long(adr+8)),mybase.fct3dpro))                                /*==== Read z ====*/
  269.       ^piv_pts:=x                                   /*==== Stock x ====*/
  270.       piv_pts:=piv_pts+4
  271.       ^piv_pts:=y                                   /*==== Stock y ====*/
  272.       piv_pts:=piv_pts+4
  273.       ^piv_pts:=z                                   /*==== Stock z ====*/
  274.       piv_pts:=piv_pts+4
  275.       adr:=adr+12
  276.   ENDFOR
  277.   adr_face:=adr                                     /*==== 3DPro can have some faces with more than 3 vertices ====*/
  278.   FOR count:=0 TO myobj.nbrsfcs-1
  279.       pts_size:=Char(adr)
  280.       IF pts_size>max_pts_face THEN max_pts_face:=pts_size
  281.       reel_nbrs_faces:=reel_nbrs_faces+(pts_size-2)
  282.       adr:=adr+22+(2*pts_size)
  283.   ENDFOR
  284.   myobj.nbrsfcs:=reel_nbrs_faces                                     /*==== The reel number of faces (convert to faces with 3 vertice ====*/
  285.   mybase.totalfcs:=mybase.totalfcs+reel_nbrs_faces                   /*==== Update databse (fcs) ====*/
  286.   myobj.datafcs:=New(reel_nbrs_faces*12)                             /*==== Allocate Mem for faces ====*/
  287.   adr:=adr_face                                                      /*==== Jump to datafaces ====*/
  288.   piv_pts:=myobj.datafcs                                             /*==== Pointer to objdatafcs ====*/
  289.   FOR count:=0 TO oldnumface-1
  290.         pts_size:=Char(adr)
  291.         badr:=adr+22
  292.         adr:=adr+22
  293.         FOR pf:=1 TO pts_size-2
  294.             x:=Int(badr)                  /*==== Read x ====*/
  295.             y:=Int(adr+2)                 /*==== Read y ====*/
  296.             z:=Int(adr+4)                 /*==== Read z ====*/
  297.             ^piv_pts:=x                   /*==== Stock x ====*/
  298.             piv_pts:=piv_pts+4
  299.             ^piv_pts:=y                   /*==== Stock y ====*/
  300.             piv_pts:=piv_pts+4
  301.             ^piv_pts:=z                   /*==== Stock z ====*/
  302.             piv_pts:=piv_pts+4
  303.             adr:=adr+2
  304.         ENDFOR
  305.         adr:=adr+4
  306.   ENDFOR
  307.   p_AjouteNode(mybase.objlist,obj_name,myobj)
  308.   IF buf THEN Dispose(buf)
  309.   Raise(OK_FICHIER)
  310. EXCEPT
  311.   RETURN exception
  312. ENDPROC
  313. /**/
  314. /*"p_ReadImagineFile(source) :Lit un fichier au format Imagine. <source>=Fichier a charger."*/
  315. PROC p_ReadImagineFile(source) HANDLE
  316. /********************************************************************************
  317.  * Para         : NONE
  318.  * Return       : OK_FICHIER if ok,else the error.
  319.  * Description  : Read Imagine (Amiga) file.
  320.  *******************************************************************************/
  321.   DEF len,a,adr,buf,handle,flen=TRUE,pos,chunk
  322.   DEF count=NIL,nbrs_edges,piv
  323.   DEF obj_name[80]:STRING
  324.   DEF adr_edges
  325.   DEF myobj:PTR TO object3d,piv_pts,x,y,z
  326.   DEF x_size,y_size,z_size
  327.   /*****************************************************/
  328.   flen:=FileLength(source)
  329.   buf:=New(flen+1)
  330.   handle:=Open(source,1005)
  331.   len:=Read(handle,buf,flen)
  332.   Close(handle)
  333.   adr:=buf
  334.   FOR a:=0 TO len-1
  335.     pos:=adr++
  336.     IF Even(pos)
  337.         chunk:=Long(pos)
  338.         SELECT chunk
  339.             CASE ID_FORM
  340.             CASE ID_TDDD
  341.             CASE ID_SIZE
  342.                 x_size:=SpMul(SpFlt(Int(pos+8)),2048.0)
  343.                 y_size:=SpMul(SpFlt(Int(pos+12)),2048.0)
  344.                 z_size:=SpMul(SpFlt(Int(pos+16)),2048.0)
  345.             CASE ID_NAME
  346.                 StringF(obj_name,pos+8,ALL)
  347.                 IF StrLen(obj_name)=0 THEN StringF(obj_name,'Object_\d',p_CountNodes(mybase.objlist))
  348.             CASE ID_PNTS
  349.                 myobj:=New(SIZEOF object3d)                     /*==== Allocate Mem for structure ====*/
  350.                 myobj.typeobj:=TYPE_IMAGINE                     /*==== Type object                ====*/
  351.                 myobj.selected:=FALSE                           /*==== Object selected            ====*/
  352.                 myobj.bounded:=FALSE                            /*==== Object bounded             ====*/
  353.                 myobj.nbrspts:=Int(pos+8)                       /*==== Number of pts              ====*/
  354.                 mybase.totalpts:=mybase.totalpts+myobj.nbrspts  /*==== Update database (pts)      ====*/
  355.                 myobj.datapts:=New(myobj.nbrspts*12)            /*==== Allocate mem for pts       ====*/
  356.                 piv_pts:=myobj.datapts                          /*==== Pointer to objdatapts      ====*/
  357.                 piv:=pos+10                                     /*==== Jump to datapts            ====*/
  358.                 dWriteF(['Imagine nom:\s',' pts:\d',' Fcs\d\n'],[obj_name,myobj.nbrspts,myobj.nbrsfcs])
  359.                 FOR count:=0 TO myobj.nbrspts-1
  360.                     /*=============================================================
  361.                     x:=Mod(Long(piv),$FFFF)                     /*==== Read x ====*/
  362.                     y:=Mod(Long(piv+4),$FFFF)                   /*==== Read y ====*/
  363.                     z:=Mod(Long(piv+8),$FFFF)                   /*==== Read z ====*/
  364.                     ==============================================================*/
  365.                     x:=SpFix(SpMul(SpDiv(x_size,SpFlt(Long(piv))),mybase.fctimagine))              /*==== Read x ====*/
  366.                     y:=SpFix(SpMul(SpDiv(y_size,SpFlt(Long(piv+4))),mybase.fctimagine))           /*==== Read y ====*/
  367.                     z:=SpFix(SpMul(SpDiv(z_size,SpFlt(Long(piv+8))),mybase.fctimagine))           /*==== Read z ====*/
  368.                     ^piv_pts:=x                                 /*==== Stock x ====*/
  369.                     piv_pts:=piv_pts+4
  370.                     ^piv_pts:=y                                 /*==== Stock y ====*/
  371.                     piv_pts:=piv_pts+4
  372.                     ^piv_pts:=z                                 /*==== Stock z ====*/
  373.                     piv_pts:=piv_pts+4
  374.                     piv:=piv+12
  375.                 ENDFOR
  376.             CASE ID_EDGE
  377.                 nbrs_edges:=Int(pos+8)                          /*==== Number of edges ====*/
  378.                 piv:=pos+10                                     /*==== just remember   ====*/
  379.                 adr_edges:=piv                                  /*==== the address     ====*/
  380.                 /*
  381.                 FOR count:=0 TO nbrs_edges-1
  382.                     WriteF('<NUM: \d[3] S1:\d[3] S2:\d[3]>',count,Int(piv),Int(piv+2))
  383.                     piv:=piv+4
  384.                 ENDFOR
  385.                 WriteF('\n')
  386.                 */
  387.             CASE ID_FACE
  388.                 myobj.nbrsfcs:=Int(pos+8)                                       /*==== Number of fcs         ====*/
  389.                 mybase.totalfcs:=mybase.totalfcs+myobj.nbrsfcs                  /*==== Update database       ====*/
  390.                 myobj.datafcs:=New(myobj.nbrsfcs*12)                            /*==== Allocate mem for fcs  ====*/
  391.                 piv_pts:=myobj.datafcs                                          /*==== Pointer to objdatafcs ====*/
  392.                 piv:=pos+10                                                     /*==== Jump to datafcs       ====*/
  393.                 FOR count:=0 TO myobj.nbrsfcs-1
  394.                     x:=Int(adr_edges+(Int(piv)*4))                              /*==== Read 1 vertice ====*/
  395.                     y:=Int(adr_edges+(Int(piv)*4+2))                            /*==== Read 2 vertice ====*/
  396.                     z:=Int(adr_edges+(Int(piv+2)*4+2))                          /*==== Read 3 vertice ====*/
  397.                     ^piv_pts:=x                                                 /*==== Stock 1 vertice ====*/
  398.                     piv_pts:=piv_pts+4
  399.                     ^piv_pts:=y                                                 /*==== Stock 2 vertice ====*/
  400.                     piv_pts:=piv_pts+4
  401.                     ^piv_pts:=z                                                 /*==== Stock 3 vertice ====*/
  402.                     piv_pts:=piv_pts+4
  403.                     /*
  404.                     WriteF('\d[2] \d[2] \d[2] \d[2] \d[2] \d[2]\n',
  405.                             Int(adr_edges+(Int(piv)*4)),
  406.                             Int(adr_edges+(Int(piv)*4+2)),
  407.                             Int(adr_edges+(Int(piv+2)*4)),
  408.                             Int(adr_edges+(Int(piv+2)*4+2)),
  409.                             Int(adr_edges+(Int(piv+4)*4)),
  410.                             Int(adr_edges+(Int(piv+4)*4+2)))
  411.                     */
  412.                     piv:=piv+6
  413.                 ENDFOR
  414.                 p_AjouteNode(mybase.objlist,obj_name,myobj)
  415.             DEFAULT
  416.                 NOP
  417.         ENDSELECT
  418.     ENDIF
  419.   ENDFOR
  420.   IF buf THEN Dispose(buf)
  421.   Raise(OK_FICHIER)
  422. EXCEPT
  423.   RETURN exception
  424. ENDPROC
  425. /**/
  426. /*"p_ReadSculptFile(source) :Lit un fichier au format Sculpt. <source>=Fichier a charger."*/
  427. PROC p_ReadSculptFile(source) HANDLE
  428. /********************************************************************************
  429.  * Para         : NONE
  430.  * Return       : OK_FICHIER if ok,else the error.
  431.  * Description  : Read Sculpt (Amiga) file.
  432.  *******************************************************************************/
  433.   DEF len,a,adr,buf,handle,flen=TRUE,pos,chunk,i,piv
  434.   DEF x,y,z
  435.   DEF myobj:PTR TO object3d,piv_pts,obj_name[80]:STRING
  436.   DEF numobj
  437.   /*****************************************************/
  438.   flen:=FileLength(source)
  439.   buf:=New(flen+1)
  440.   handle:=Open(source,1005)
  441.   len:=Read(handle,buf,flen)
  442.   Close(handle)
  443.   adr:=buf
  444.   FOR a:=0 TO len-1
  445.     pos:=adr++
  446.     IF Even(pos)
  447.         chunk:=Long(pos)
  448.         SELECT chunk
  449.             CASE ID_FORM
  450.             CASE ID_SC3D
  451.             CASE ID_VERT
  452.                 numobj:=p_CountNodes(mybase.objlist)
  453.                 StringF(obj_name,'Object_\d',numobj+1)
  454.                 myobj:=New(SIZEOF object3d)                        /*==== Allocate mem for structure ====*/
  455.                 myobj.typeobj:=TYPE_SCULPT                         /*==== Type object                ====*/
  456.                 myobj.selected:=FALSE                              /*==== Object selected            ====*/
  457.                 myobj.bounded:=FALSE                               /*==== Object bounded             ====*/
  458.                 myobj.nbrspts:=Long(pos+4)/12                      /*==== Number of pts              ====*/
  459.                 mybase.totalpts:=mybase.totalpts+myobj.nbrspts     /*==== Update database (pts)      ====*/
  460.                 myobj.datapts:=New(myobj.nbrspts*12)               /*==== Allocate mem for pts       ====*/
  461.                 piv_pts:=myobj.datapts                             /*==== Pointer to objdatapts      ====*/
  462.                 piv:=pos+8                                         /*==== Jump to datapts            ====*/
  463.                 FOR i:=0 TO myobj.nbrspts-1
  464.                     /*================================================================
  465.                     x:=Mod(Long(piv),$FFFF)                        /*==== Read x ====*/
  466.                     y:=Mod(Long(piv+4),$FFFF)                      /*==== Read y ====*/
  467.                     z:=Mod(Long(piv+8),$FFFF)                      /*==== Read z ====*/
  468.                     =================================================================*/
  469.                     x:=SpFix(SpMul(SpFlt(Long(piv)),mybase.fctsculpt))                        /*==== Read x ====*/
  470.                     y:=SpFix(SpMul(SpFlt(Long(piv+4)),mybase.fctsculpt))                      /*==== Read y ====*/
  471.                     z:=SpFix(SpMul(SpFlt(Long(piv+8)),mybase.fctsculpt))                      /*==== Read z ====*/
  472.                     ^piv_pts:=x                                    /*==== Stock x ====*/
  473.                     piv_pts:=piv_pts+4
  474.                     ^piv_pts:=y                                    /*==== Stock y ====*/
  475.                     piv_pts:=piv_pts+4
  476.                     ^piv_pts:=z                                    /*==== Stock z ====*/
  477.                     piv_pts:=piv_pts+4
  478.                     piv:=piv+12
  479.                 ENDFOR
  480.             CASE ID_EDGE
  481.             CASE ID_FACE
  482.                 myobj.nbrsfcs:=Long(pos+4)/16                                 /*==== Number of fcs         ====*/
  483.                 myobj.datafcs:=New(myobj.nbrsfcs*12)                          /*==== Allocate mem for fcs  ====*/
  484.                 mybase.totalfcs:=mybase.totalfcs+myobj.nbrsfcs                /*==== Update database (fcs) ====*/
  485.                 piv_pts:=myobj.datafcs                                        /*==== Pointer to objdatafcs ====*/
  486.                 piv:=pos+8                                                    /*==== Jump to datafcs       ====*/
  487.                 FOR i:=0 TO myobj.nbrsfcs-1
  488.                     x:=Long(piv)                          /*==== Read 1 vertice ====*/
  489.                     y:=Long(piv+4)                        /*==== Read 2 vertice ====*/
  490.                     z:=Long(piv+8)                        /*==== Read 3 vertice ====*/
  491.                     ^piv_pts:=x                           /*==== Stock 1 vertice ====*/
  492.                     piv_pts:=piv_pts+4
  493.                     ^piv_pts:=y                           /*==== Stock 2 vertice ====*/
  494.                     piv_pts:=piv_pts+4
  495.                     ^piv_pts:=z                           /*==== Stock 3 vertice ====*/
  496.                     piv_pts:=piv_pts+4
  497.                     piv:=piv+16
  498.                 ENDFOR
  499.                 p_AjouteNode(mybase.objlist,obj_name,myobj)
  500.             DEFAULT
  501.                 NOP
  502.         ENDSELECT
  503.     ENDIF
  504.   ENDFOR
  505.   IF buf THEN Dispose(buf)
  506.   Raise(OK_FICHIER)
  507. EXCEPT
  508.   RETURN exception
  509. ENDPROC
  510. /**/
  511. /*"p_ReadVertexFile(chunk,source) :Lit un fichier au format Vertex,<chunk>=LONG,<source>=Fichier a charger."*/
  512. PROC p_ReadVertexFile(chunk,source) HANDLE
  513. /********************************************************************************
  514.  * Para         : the version chunk of the vertex file.
  515.  * Return       : OK_FICHIER if ok,else the error.
  516.  * Description  : Read Vertex (Amiga) file.
  517.  *******************************************************************************/
  518.   DEF len,a,adr,buf,handle,flen=TRUE
  519.   DEF piv
  520.   DEF nbrs_edges,x,y,z
  521.   DEF myobj:PTR TO object3d,piv_pts,obj_name[80]:STRING
  522.   DEF numobj
  523.   /*****************************************************/
  524.   flen:=FileLength(source)
  525.   buf:=New(flen+1)
  526.   handle:=Open(source,1005)
  527.   len:=Read(handle,buf,flen)
  528.   Close(handle)
  529.   adr:=buf
  530.   numobj:=p_CountNodes(mybase.objlist)
  531.   StringF(obj_name,'Object_\d',numobj+1)
  532.   myobj:=New(SIZEOF object3d)                          /*==== Allocate mem for structure ====*/
  533.   IF chunk=ID_VE3D THEN myobj.typeobj:=TYPE_OLDVERTEX ELSE myobj.typeobj:=TYPE_NEWVERTEX    /*==== Object type ====*/
  534.   myobj.selected:=FALSE                                /*==== Object selected ====*/
  535.   myobj.bounded:=FALSE                                 /*==== Object bounded  ====*/
  536.   myobj.nbrspts:=Long(adr+4)                           /*==== Number of pts   ====*/
  537.   mybase.totalpts:=mybase.totalpts+myobj.nbrspts       /*==== Update database (pts) ====*/
  538.   myobj.datapts:=New(myobj.nbrspts*12)                 /*==== Allocate mem for pts ====*/
  539.   piv_pts:=myobj.datapts                               /*==== Pointer to objdatapts ====*/
  540.   piv:=adr+8                                           /*==== Jump to datapts ====*/
  541.   dWriteF(['Vertex Nom:\s',' pts:\d',' Fcs\d\n'],[obj_name,myobj.nbrspts,myobj.nbrsfcs])
  542.   FOR a:=0 TO myobj.nbrspts-1
  543.       /*==================================================================
  544.       x:=Mod(Long(piv),$FFFF)                          /*==== Read x ====*/
  545.       y:=Mod(Long(piv+4),$FFFF)                        /*==== Read y ====*/
  546.       z:=Mod(Long(piv+8),$FFFF)                        /*==== Read z ====*/
  547.       ===================================================================*/
  548.       x:=SpFix(SpMul(SpFlt(Long(piv)),mybase.fctvertex))                          /*==== Read x ====*/
  549.       y:=SpFix(SpMul(SpFlt(Long(piv+4)),mybase.fctvertex))                        /*==== Read y ====*/
  550.       z:=SpFix(SpMul(SpFlt(Long(piv+8)),mybase.fctvertex))                        /*==== Read z ====*/
  551.       ^piv_pts:=x                                      /*==== Stock x ====*/
  552.       piv_pts:=piv_pts+4
  553.       ^piv_pts:=y                                      /*==== Stock y ====*/
  554.       piv_pts:=piv_pts+4
  555.       ^piv_pts:=z                                      /*==== Stock z ====*/
  556.       piv_pts:=piv_pts+4
  557.       /*WriteF('X \d[12] Y \d[12] Z \d[12]\n',Mod(Long(piv),$FFFF),Mod(Long(piv+4),$FFFF),Mod(Long(piv+8),$FFFF))*/
  558.       IF chunk=ID_VE3D THEN piv:=piv+16 ELSE piv:=piv+17
  559.       /*piv:=piv+17*/
  560.   ENDFOR
  561.   nbrs_edges:=Long(piv)
  562.   piv:=piv+4+Mul(nbrs_edges,8)
  563.   myobj.nbrsfcs:=Long(piv)                             /*==== Number of fcs ====*/
  564.   mybase.totalfcs:=mybase.totalfcs+myobj.nbrsfcs       /*==== Update database fcs ====*/
  565.   myobj.datafcs:=New(myobj.nbrsfcs*12)                 /*==== Allocate mem for fcs ====*/
  566.   piv_pts:=myobj.datafcs                               /*==== Pointer to objdatafcs ====*/
  567.   piv:=piv+4                                           /*==== Jump to datafcs ====*/
  568.   FOR a:=0 TO myobj.nbrsfcs-1
  569.       x:=Long(piv)-1                                   /*==== Read 1 vertice ====*/
  570.       y:=Long(piv+4)-1                                 /*==== Read 2 vertice ====*/
  571.       z:=Long(piv+8)-1                                 /*==== Read 3 vertice ====*/
  572.       ^piv_pts:=x                                      /*==== Stock 1 vertice ====*/
  573.       piv_pts:=piv_pts+4
  574.       ^piv_pts:=y                                      /*==== Stock 2 vertice ====*/
  575.       piv_pts:=piv_pts+4
  576.       ^piv_pts:=z                                      /*==== Stock 3 vertice ====*/
  577.       piv_pts:=piv_pts+4
  578.       piv:=piv+12
  579.   ENDFOR
  580.   p_AjouteNode(mybase.objlist,obj_name,myobj)
  581.   IF buf THEN Dispose(buf)
  582.   Raise(OK_FICHIER)
  583. EXCEPT
  584.   RETURN exception
  585. ENDPROC
  586. /**/
  587. /*"p_ReadVertex2File(source):Lit un fichier au format VerteX2.0,<source>=Fichier a charger."*/
  588. PROC p_ReadVertex2File(source) HANDLE
  589. /********************************************************************************
  590.  * Para         : NONE
  591.  * Return       : OK_FICHIER if ok,else the error.
  592.  * Description  : Read Sculpt (Amiga) file.
  593.  *******************************************************************************/
  594.   DEF len,a,adr,buf,handle,flen=TRUE,pos,chunk,i,piv
  595.   DEF x,y,z
  596.   DEF myobj:PTR TO object3d,piv_pts,obj_name[80]:STRING
  597.   DEF numobj
  598.   DEF longf,longe,adr_edges,nbrs_edges
  599.   /*****************************************************/
  600.   flen:=FileLength(source)
  601.   buf:=New(flen+1)
  602.   handle:=Open(source,1005)
  603.   len:=Read(handle,buf,flen)
  604.   Close(handle)
  605.   adr:=buf
  606.   FOR a:=0 TO len-1
  607.     pos:=adr++
  608.     IF Even(pos)
  609.         chunk:=Long(pos)
  610.         SELECT chunk
  611.             CASE ID_NAME
  612.                 StringF(obj_name,pos+8,ALL)
  613.                 IF StrLen(obj_name)=0 THEN StringF(obj_name,'Object_\d',p_CountNodes(mybase.objlist))
  614.             CASE ID_VERT
  615.                 numobj:=p_CountNodes(mybase.objlist)
  616.                 myobj:=New(SIZEOF object3d)
  617.                 myobj.typeobj:=TYPE_VERTEX2                        /*==== Type object                ====*/
  618.                 myobj.selected:=FALSE                              /*==== Object selected            ====*/
  619.                 myobj.bounded:=FALSE                               /*==== Object bounded             ====*/
  620.                 myobj.nbrspts:=Long(pos+4)/12                      /*==== Number of pts              ====*/
  621.                 mybase.totalpts:=mybase.totalpts+myobj.nbrspts     /*==== Update database (pts)      ====*/
  622.                 myobj.datapts:=New(myobj.nbrspts*12)               /*==== Allocate mem for pts       ====*/
  623.                 piv_pts:=myobj.datapts                             /*==== Pointer to objdatapts      ====*/
  624.                 piv:=pos+8                                         /*==== Jump to datapts            ====*/
  625.                 FOR i:=0 TO myobj.nbrspts-1
  626.                     /*================================================================
  627.                     x:=Mod(Long(piv),$FFFF)                        /*==== Read x ====*/
  628.                     y:=Mod(Long(piv+4),$FFFF)                      /*==== Read y ====*/
  629.                     z:=Mod(Long(piv+8),$FFFF)                      /*==== Read z ====*/
  630.                     =================================================================*/
  631.                     x:=SpFix(SpMul(SpFlt(Long(piv)),mybase.fctvertex))                        /*==== Read x ====*/
  632.                     y:=SpFix(SpMul(SpFlt(Long(piv+4)),mybase.fctvertex))                      /*==== Read y ====*/
  633.                     z:=SpFix(SpMul(SpFlt(Long(piv+8)),mybase.fctvertex))                      /*==== Read z ====*/
  634.                     ^piv_pts:=x                                    /*==== Stock x ====*/
  635.                     piv_pts:=piv_pts+4
  636.                     ^piv_pts:=y                                    /*==== Stock y ====*/
  637.                     piv_pts:=piv_pts+4
  638.                     ^piv_pts:=z                                    /*==== Stock z ====*/
  639.                     piv_pts:=piv_pts+4
  640.                     piv:=piv+12
  641.                 ENDFOR
  642.             CASE ID_EDGE
  643.                 longe:=Long(pos+4)
  644.                 IF longe<765
  645.                     nbrs_edges:=longe/3
  646.                 ELSE
  647.                     nbrs_edges:=longe/6
  648.                 ENDIF
  649.                 adr_edges:=pos+8
  650.             CASE ID_FACE
  651.                 longf:=Long(pos+4)
  652.                 IF longf<765
  653.                     myobj.nbrsfcs:=Long(pos+4)/3                                 /*==== Number of fcs         ====*/
  654.                     dWriteF(['InProc nbrsFcs (Byte) :\d\n'],[myobj.nbrsfcs])
  655.                 ELSE
  656.                     myobj.nbrsfcs:=Long(pos+4)/6                                 /*==== Number of fcs         ====*/
  657.                     dWriteF(['InProc nbrsFcs (Int) :\d\n'],[myobj.nbrsfcs])
  658.                 ENDIF
  659.                 myobj.datafcs:=New(myobj.nbrsfcs*12)                          /*==== Allocate mem for fcs  ====*/
  660.                 mybase.totalfcs:=mybase.totalfcs+myobj.nbrsfcs                /*==== Update database (fcs) ====*/
  661.                 piv_pts:=myobj.datafcs                                        /*==== Pointer to objdatafcs ====*/
  662.                 piv:=pos+8                                                    /*==== Jump to datafcs       ====*/
  663.                 FOR i:=0 TO myobj.nbrsfcs-1
  664.                     IF longf<765
  665.                         x:=Char(piv)-1
  666.                         y:=Char(piv+1)-1
  667.                         z:=Char(piv+2)-1
  668.                         ^piv_pts:=x                           /*==== Stock 1 vertice ====*/
  669.                         piv_pts:=piv_pts+4
  670.                         ^piv_pts:=y                           /*==== Stock 2 vertice ====*/
  671.                         piv_pts:=piv_pts+4
  672.                         ^piv_pts:=z                           /*==== Stock 3 vertice ====*/
  673.                         piv_pts:=piv_pts+4
  674.                         piv:=piv+3
  675.                     ELSE
  676.                         x:=Int(piv)-1                          /*==== Read 1 vertice ====*/
  677.                         y:=Int(piv+2)-1                        /*==== Read 2 vertice ====*/
  678.                         z:=Int(piv+4)-1                        /*==== Read 3 vertice ====*/
  679.                         ^piv_pts:=x                           /*==== Stock 1 vertice ====*/
  680.                         piv_pts:=piv_pts+4
  681.                         ^piv_pts:=y                           /*==== Stock 2 vertice ====*/
  682.                         piv_pts:=piv_pts+4
  683.                         ^piv_pts:=z                           /*==== Stock 3 vertice ====*/
  684.                         piv_pts:=piv_pts+4
  685.                         piv:=piv+6
  686.                     ENDIF
  687.                 ENDFOR
  688.                 p_AjouteNode(mybase.objlist,obj_name,myobj)
  689.             DEFAULT
  690.                 NOP
  691.         ENDSELECT
  692.     ENDIF
  693.   ENDFOR
  694.   IF buf THEN Dispose(buf)
  695.   Raise(OK_FICHIER)
  696. EXCEPT
  697.   RETURN exception
  698. ENDPROC
  699. /**/
  700. /**/
  701.  
  702.